#ifndef __UART_PERIPHERAL_H
#define __UART_PERIPHERAL_H

#include "stdint.h"

#define UART_DEBUG_TASK_EN	1

#define UART1_RX_PDMA_CH	0
#define UART1_TX_PDMA_CH	4
#define UART2_RX_PDMA_CH	1
#define UART2_TX_PDMA_CH    2

#define UART1_RX_BUF_SIZE	10240
#define UART2_RX_BUF_SIZE	256

#define UART1_RX_PDMA_EN	1
#define UART2_RX_PDMA_EN	1

typedef enum {
	UART_COM1,
	UART_COM2
} UART_COM_LIST;

void UartRawSend_YX020(UART_COM_LIST com, const uint8_t *data, uint16_t len);

void UartInit(UART_COM_LIST com, uint32_t baud);
int UartPrintf(UART_COM_LIST com, const char *format, ...);
void UartPuts(UART_COM_LIST com, const char *str);
void UartRawSendByte(UART_COM_LIST com, uint8_t b);
void UartRawSend(UART_COM_LIST com, const uint8_t *data, uint16_t len);

void UartRawSendPDMA(UART_COM_LIST com, uint32_t addr, uint16_t len);
void UartPutsPDMA(UART_COM_LIST com, const char *str);
void UartPrintfPDMA(UART_COM_LIST com, const char *format, ...);

void UartClearBuffer(UART_COM_LIST com);

void UartSetSopbit(UART_COM_LIST com, uint8_t stopbit);
uint8_t *UartGetRxBuffer(UART_COM_LIST com);
uint16_t UartGetReceiveLen(UART_COM_LIST com);
uint32_t UartGetBaud(UART_COM_LIST com);

void UartSetBaud(UART_COM_LIST com, uint32_t baud);

void UartWaitSendDone(UART_COM_LIST com);
uint8_t UartCheckSendDone(UART_COM_LIST com);

void UartIOToCore(UART_COM_LIST com, uint8_t withRx);
void UartIOToPeripheral(UART_COM_LIST com, uint8_t withRx);
void UartTxPullUp(UART_COM_LIST com);
void UartTxPullDown(UART_COM_LIST com);
void UartRxPullUp(UART_COM_LIST com);
void UartRxPullDown(UART_COM_LIST com);
void UartCheckError(UART_COM_LIST com);

void UartCallbackInPDMAISR(UART_COM_LIST com);

#if UART_DEBUG_TASK_EN

typedef struct {
	uint32_t inten;
	uint32_t fifo;
	uint32_t line;
	uint32_t modem;
	uint32_t modemsts;
	uint32_t fifosts;
	uint32_t intsts;
} UartDebugRegs;

typedef struct {
	uint32_t dsct_ctl;
	uint32_t chctl;
	uint32_t pause;
	uint32_t swreq;
	uint32_t trgsts;
	uint32_t inten;
	uint32_t intsts;
	uint32_t abtsts;
	uint32_t tdsts;
	uint32_t align;
	uint32_t tactsts;
	uint32_t chrst;
} UartPDMADebugRegs;

void UartGetRegs(UartDebugRegs *uart1_regs, UartPDMADebugRegs *pdma_regs);
#endif

#endif
